import { HttpMethod } from '@/types/type'
import { AxiosResponse } from 'axios'
import { TagProps } from 'element-plus'

/**
 * 将菜单类型转换成Tag类型
 * @param value 菜单类型
 * @returns Tag类型
 */
const getMenuTagType = (value: number): { value: string; type: TagProps['type'] } | undefined => {
    switch (value) {
        case 1:
            return { value: '目录', type: 'primary' }
        case 2:
            return { value: '菜单', type: 'success' }
        case 3:
            return { value: '按钮', type: 'warning' }
        default:
            break
    }
}
/**
 * 获取请求方法对应的tag颜色值
 * @param httpMethod 请求方法
 * @returns
 */
const getHttpMethodTagColor = (httpMethod: HttpMethod) => {
    switch (httpMethod) {
        case 'GET':
            return '#61AFFE'
        case 'POST':
            return '#49CC90'
        case 'PUT':
            return '#FCA130'
        case 'DELETE':
            return '#F93E3E'
        case 'PATCH':
            return '#50E3C2'
        case 'OPTIONS':
            return '#0D5AA7'
        case 'HEAD':
            return '#9012FE'
        default:
            break
    }
}

/**
 * 扁平化拥有children属性的数组
 * @param arr 需要转换的数组
 * @param isKeepChildren 是否将children数组清空，默认为true
 * @returns 扁平化的数组
 */
const getFlatArray = (arr: any[], isClearChildren = true) => {
    const newArr: any[] = []
    const recurse = (current: any[]) => {
        current?.forEach((item: any) => {
            if (isClearChildren) {
                newArr.push({ ...item, children: [] })
            } else {
                newArr.push({ ...item })
            }
            if (item.children?.length !== 0) {
                recurse(item.children)
            }
        })
    }
    recurse(arr)
    return newArr
}

/**
 * 获得当前元素的所有祖先元素
 * @param treeArr 树形数组
 * @param value 当前元素
 * @param isFlat 传入的是否是扁平化数组，默认为true，为false则需要提前扁平化后在传入
 * @returns 所有祖先元素
 */
const getAncestors = (treeArr: any[], value: any, isFlat = true) => {
    const newArr: any[] = []
    let flatArr = treeArr
    if (isFlat) {
        flatArr = getFlatArray(treeArr)
    }
    const recurse = (currentArr: any[], current: any) => {
        currentArr.forEach((item: any) => {
            if (item.id !== current.parentId) {
                return
            } else {
                if (!newArr.includes(item.id)) {
                    newArr.push(item.id)
                    if (item.parentId && item.parentId !== 0) {
                        recurse(flatArr, item)
                    }
                }
            }
        })
    }
    recurse(flatArr, value)
    return newArr
}
/**
 * 获得当前元素的所有祖先元素的Id
 * @param treeArr 树形数组
 * @param value 当前元素
 * @param isFlat 传入的是否是扁平化数组，默认为true，为false则需要提前扁平化后在传入
 * @returns 所有祖先元素的Id数组
 */
const getAncestorIds = (treeArr: any[], value: any, isFlat = true) => {
    const newArr: number[] = []
    let flatArr = treeArr
    if (isFlat) {
        flatArr = getFlatArray(treeArr)
    }
    const recurse = (currentArr: any[], current: any) => {
        currentArr.forEach((item: any) => {
            if (item.id !== current.parentId) {
                return
            } else {
                newArr.push(item.id)
                if (item.parentId && item.parentId !== 0) {
                    recurse(flatArr, item)
                }
            }
        })
    }
    recurse(flatArr, value)
    return newArr
}
/**
 * 从响应头中获得文件名，没有返回默认值
 * @param response 响应
 * @param filename 默认文件名，默认为：'下载文件.zip'
 * @returns 包含扩展名的文件名
 */
const getFileName = (response: AxiosResponse<any, any>, filename = '下载文件.zip') => {
    // 获取文件名，优先尝试从响应头部Content-Disposition中解析出来
    const contentDisposition = response.headers['content-disposition']
    if (contentDisposition) {
        // 尝试匹配 filename* 参数，这是带有编码的文件名
        const matches = /filename\*=(?:UTF-8'?')?(.*)/i.exec(contentDisposition)
        if (matches && matches[1]) {
            // 对 URL 编码的文件名进行解码
            filename = decodeURIComponent(matches[1])
        } else {
            // 如果没有 filename*，退回到 filename 参数
            const oldMatches = /filename=(.*?)(;|$)/.exec(contentDisposition)
            if (oldMatches && oldMatches[1]) {
                filename = oldMatches[1].replace(/['"]/g, '') // 去掉引号
            }
        }
    }
    return filename
}

export { getFlatArray, getAncestors, getAncestorIds, getHttpMethodTagColor, getMenuTagType, getFileName }
